﻿/***************************************************** 
** 命名空间: ShieldSimulatorWebBLL 
** 文 件 名：DataCollector 
** 内容简述：数据收集器，主要描述对仿真器中数据的采集操作，根据需求采集对应的数据
* 列表(30个最新数据/时间段内超过30条的部分数据) 折线(返回一个集合 时间、三个主要数据、环号) 柱状图(返回一个集合 时间、6个最大最小主要数据、环号)
** 版    本：V1.0 
** 创 建 人：伍兆祥
** 创建日期：2018/4/9 13:24:22 
** 修改记录：
日期        版本      修改人    修改内容    
*****************************************************/


using ShieldSimulatorWebModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ShieldSimulatorWebBLL
{
    /// <summary>
    /// 数据采集器 --控制启停，收集数据发送给Manager
    /// </summary>
    public class DataCollector
    { 
        /// <summary>
        /// 单例 采集器 不存数据，负责采集数据并与数据中心交换数据
        /// </summary>
        private static DataCollector _Instance;
        /// <summary>
        /// 对外公开的方法以便调用本采集器单例
        /// </summary>
        /// <returns></returns>
        public static DataCollector CreateCollector()
        {
            if (_Instance == null) return _Instance = new DataCollector();
            else return _Instance;
            //return _instance ?? (_instance = new DataGather()); //为空返回左，不为空返回右创建新实例
        }


        private static DataSimulator _datasim = new DataSimulator();
        private bool _isWorking;
        private Thread _collectAndStore;
        /// <summary>
        /// 开启采集数据，每秒采集一次
        /// </summary>
        /// <returns>返回采集状态</returns>
        public bool StartServer()
        {
            //如果已经在工作中，则直接返回方法外，不向下执行
            if (_isWorking) return true;
            //——— new创建的新线程因为会赋给私有_collectAndStore，故实际上只有一个线程在工作，线程实例在内存中可能会有很多
            //——— 但是真正执行Start的只有赋给_collectAndStore的一个线程，其他线程最后会被gc掉
            //启动采集器时让线程发起一个委托，起一个线程负责取存数据
            _isWorking = true;
            _collectAndStore = new Thread(Working);
            _collectAndStore.Start();
            return true;
        }
        /// <summary>
        /// 停止采集数据
        /// </summary>
        /// <returns>返回采集状态</returns>
        public void StopServer()
        {
            _isWorking = false;
            _collectAndStore.Abort();//直接打断进程
        }
        private void Working()
        {
            ////反复循环检查_isWorking的状态是不是true，是的话线程睡眠一秒后生成一个数据丢给数据中心
            ////如果_isWorking的状态是false，则委托内实际上没有需要执行的具体语句体
            while (_isWorking == true)
            {
                ///取得数据，并经数据管理中心往dal持久层中存(本应该是存进物理磁盘数据库中，现在是dal中创建静态list存相应数据)
                Thread.Sleep(1000);//先等一秒，避免快速点按按钮造成生成了两个时间相同的数据
                var result = _datasim.SimData2();//从被动模拟器中生产一个数据出来，此时根据线程有1秒间隔
                //发送给数据中心中AddDataToDal方法
                DataManager.GetInstance().AddDataToDal(result);
            }
        }
    }
}
